///  类似地，`mod inaccessible` 和 `mod nested` 将找到 `nested.rs` 和
///  `inaccessible.rs` 文件，并在它们放到各自的模块中。
mod inaccessible;
pub mod nested;

// 一个公有的结构体，带有一个公有的字段（类型为泛型 `T`）
pub struct OpenBox<T> {
    pub contents: T,
}

// 一个公有的结构体，带有一个私有的字段（类型为泛型 `T`）
#[allow(dead_code)]
pub struct ClosedBox<T> {
    contents: T,
}

impl<T> ClosedBox<T> {
    // 一个公有的构造器方法
    pub fn new(contents: T) -> ClosedBox<T> {
        ClosedBox { contents: contents }
    }
}

pub fn function() {
    println!("called `my::function()`");
}

fn private_function() {
    println!("called `my::private_function()`");
}

pub fn indirect_access() {
    print!("called `my::indirect_access()`, that\n> ");

    private_function();
}

mod cool;

pub fn indirect_call() {
    // 让我们从这个作用域中访问所有名为 `function` 的函数！
    print!("called `my::indirect_call()`, that\n> ");

    // `self` 关键字表示当前的模块作用域——在这个例子是 `my`。
    // 调用 `self::function()` 和直接调用 `function()` 都得到相同的结果，
    // 因为他们表示相同的函数。
    self::function();
    function();

    // 我们也可以使用 `self` 来访问 `my` 内部的另一个模块：
    self::cool::function();

    // `super` 关键字表示父作用域（在 `my` 模块外面）。
    super::function();

    // 这将在 *crate* 作用域内绑定 `cool::function` 。
    // 在这个例子中，crate 作用域是最外面的作用域。
    {
        use crate::cool::function as root_function;
        root_function();
    }
}
